package com.sojson.util.pay.wx.bean;

import javax.servlet.http.HttpServletRequest;

import com.sojson.util.SpringUtil;
import com.sojson.util.StringUtil;
import com.sojson.util.pay.wx.PayWxParamNofityVerifyInterface;
import com.sojson.util.pay.wx.constant.WxConstant;
import com.sojson.util.servlet.ServletUtil;

/**
 * 微信回调通知处理Bean
 * 
 * @author liu
 * @date 2021-10-10
 */
public class WxNotify {

    private PayWxParamNofityVerifyInterface paramNofityVerifyInterface =
        SpringUtil.getBeanByType(PayWxParamNofityVerifyInterface.class);

    /**
     * 收到回调但是支付状态不是成功
     * 
     * @return
     */
    public boolean orderFailManage(WxResponseV3 paramResult) {
        return true;
    }

    /**
     * 处理订单,返回成功还是失败
     * 
     * @return
     */
    public boolean orderManage(WxResponseV3 paramResult) {
        return true;
    }

    /**
     * 收到回调但是支付状态不是成功(V2接口)
     * 
     * @return
     */
    public boolean orderFailManageV2(WxResponseV2 paramResult) {
        return true;
    }

    /**
     * 处理订单,返回成功还是失败(V2接口)
     * 
     * @return
     */
    public boolean orderManageV2(WxResponseV2 paramResult) {
        return true;
    }

    /**
     * 获取处理支付成功后的信息
     * 
     * @return
     */
    public Object run() {
        HttpServletRequest request = ServletUtil.getHttpServletRequest();

        try {
            // 校验参数并解密密文
            WxResponseV3 paramResult = paramNofityVerifyInterface.payNofity(request);
            // 验证不通过
            if (StringUtil.isBlankObject(paramResult)) {
                return getFail();
            }
            if (!WxConstant.SUCCESS.equals(paramResult.getTradeState())) {
                boolean orderFailManage = orderFailManage(paramResult);
                if (orderFailManage) {
                    // 通知微信处理完成
                    return getSuccess();
                } else {
                    // 通知微信处理失败
                    return getFail();
                }
            }

            // 处理订单
            boolean orderManage = orderManage(paramResult);
            if (orderManage) {
                // 通知微信处理完成
                return getSuccess();
            } else {
                // 通知微信处理失败
                return getFail();
            }
        } catch (Exception e) {
            // 验证不通过
            return getFail(e.getMessage());
        }
    }

    /**
     * 获取处理退款成功后的信息
     * 
     * @return
     */
    public Object runCancel() {
        HttpServletRequest request = ServletUtil.getHttpServletRequest();

        try {
            // 校验参数并解密密文
            WxResponseV3 paramResult = paramNofityVerifyInterface.payNofity(request);
            // 验证不通过
            if (StringUtil.isBlankObject(paramResult)) {
                return getFail();
            }
            String refundStatus = paramResult.getRefundStatus();
            if (!WxConstant.SUCCESS.equals(refundStatus)) {
                boolean orderFailManage = orderFailManage(paramResult);
                if (orderFailManage) {
                    // 通知微信处理完成
                    return getSuccess();
                } else {
                    // 通知微信处理失败
                    return getFail();
                }
            }

            // 处理订单
            boolean orderManage = orderManage(paramResult);
            if (orderManage) {
                // 通知微信处理完成
                return getSuccess();
            } else {
                // 通知微信处理失败
                return getFail();
            }
        } catch (Exception e) {
            // 验证不通过
            return getFail(e.getMessage());
        }
    }

    /**
     * 获取处理支付成功后的信息(V2接口)
     * 
     * @return
     */
    public Object runV2() {
        HttpServletRequest request = ServletUtil.getHttpServletRequest();

        try {
            // 校验参数并解密密文
            WxResponseV2 paramResult = paramNofityVerifyInterface.payNofityV2(request);
            // 验证不通过
            if (StringUtil.isBlankObject(paramResult)) {
                return getFailV2();
            }
            if (!WxConstant.SUCCESS.equals(paramResult.getReturnCode())) {
                // 通知微信处理失败
                return getFailV2();
            }
            if (!WxConstant.SUCCESS.equals(paramResult.getResultCode())) {
                boolean orderFailManage = orderFailManageV2(paramResult);
                if (orderFailManage) {
                    // 通知微信处理完成
                    return getSuccessV2();
                } else {
                    // 通知微信处理失败
                    return getFailV2();
                }
            }

            // 处理订单
            boolean orderManage = orderManageV2(paramResult);
            if (orderManage) {
                // 通知微信处理完成
                return getSuccessV2();
            } else {
                // 通知微信处理失败
                return getFailV2();
            }
        } catch (Exception e) {
            // 验证不通过
            return getFailV2(e.getMessage());
        }
    }

    /**
     * 获取处理成功后的信息
     * 
     * @return
     */
    private WxCallBackBean getSuccess() {
        WxCallBackBean wxCallBackBean = new WxCallBackBean();
        wxCallBackBean.setCode(WxConstant.SUCCESS);
        return wxCallBackBean;
    }

    /**
     * 获取处理失败后的信息
     * 
     * @return
     */
    private WxCallBackBean getFail() {
        WxCallBackBean wxCallBackBean = new WxCallBackBean();
        ServletUtil.getHttpServletResponse().setStatus(500);
        wxCallBackBean.setCode(WxConstant.FAIL);
        return wxCallBackBean;
    }

    /**
     * 获取处理失败后的信息
     * 
     * @param msg   错误信息
     * @return
     */
    private WxCallBackBean getFail(String msg) {
        WxCallBackBean wxCallBackBean = new WxCallBackBean();
        ServletUtil.getHttpServletResponse().setStatus(500);
        wxCallBackBean.setCode(WxConstant.FAIL);
        wxCallBackBean.setMessage(msg);
        return wxCallBackBean;
    }

    /**
     * 获取处理成功后的信息(V2接口)
     * 
     * @return
     */
    private String getSuccessV2() {
        return null;
    }

    /**
     * 获取处理失败后的信息(V2接口)
     * 
     * @return
     */
    private String getFailV2() {
        return null;
    }

    /**
     * 获取处理失败后的信息(V2接口)
     * 
     * @param msg   错误信息
     * @return
     */
    private WxCallBackBean getFailV2(String msg) {
        return null;
    }

}